using System.Collections.Generic;
using System.Security.Claims;
using IdentityServer4;
using IdentityServer4.Models;

namespace Idp_Login
{
    public partial class Config_Clients_Demo
    {

        // clients want to access resources (aka scopes)
        //客户想要访问资源（也称为作用域）
        public static IEnumerable<Client> GetClientDemos()
        {

            //注册Client
            var client = new List<Client>();
            //FrontA1,   =>BackA1:授权码模式AuthorizationCode
            client.Add(new Client
            {
                ClientId = "FrontA1",
                ClientName = "FrontA1客户端",
                //ClientUri = "http://192.168.10.89:8000",
                ClientUri = "http://127.0.0.1",//postman不需要,实际不知道

                AllowedGrantTypes = GrantTypes.Code,
                AllowAccessTokensViaBrowser = true,
                RequireConsent = false, //为true 时, 要单独写 controller + 页面
                ClientSecrets = new[] { new Secret("secret_FrontA1".Sha256()) },

                AccessTokenLifetime = 30,//设置AccessToken过期时间

                //RefreshTokenExpiration = TokenExpiration.Absolute,//刷新令牌将在固定时间点到期
                AbsoluteRefreshTokenLifetime = 2592000,//单位秒. RefreshToken的最长生命周期,默认30天
                RefreshTokenExpiration = TokenExpiration.Sliding,//刷新令牌时，将刷新RefreshToken的生命周期。RefreshToken的总生命周期不会超过AbsoluteRefreshTokenLifetime。
                SlidingRefreshTokenLifetime = 3600,//以秒为单位滑动刷新令牌的生命周期。
                //按照现有的设置，如果3600秒内没有使用RefreshToken，那么RefreshToken将失效。即便是在3600秒内一直有使用RefreshToken，RefreshToken的总生命周期不会超过30天。所有的时间都可以按实际需求调整。

                AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为true

                //登录成功后返回的客户端地址
                RedirectUris =
                {
                    //postman 模拟,  这个地址是后端的,实际开发可以是前端的地址
                    "http://127.0.0.1:5555/ids4/IndexCodeToken",//授权码模式AuthorizationCode
                },

                PostLogoutRedirectUris =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"

                },

                AllowedCorsOrigins =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"
                },

                AllowedScopes =
                {
                    "BackA1",
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.OfflineAccess, //如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess
                }
            });

            //FrontA2,  =>BackA2:简化模式implicit
            client.Add(new Client
            {
                ClientId = "FrontA2",
                ClientName = "FrontA2客户端",
                //ClientUri = "http://192.168.10.89:8000",
                ClientUri = "http://127.0.0.1",//postman不需要,实际不知道

                AllowedGrantTypes = GrantTypes.Implicit,
                AllowAccessTokensViaBrowser = true,
                RequireConsent = false, //为true 时, 要单独写 controller + 页面
                ClientSecrets = new[] { new Secret("secret_FrontA2".Sha256()) },

                AccessTokenLifetime = 3600,//设置AccessToken过期时间

                //RefreshTokenExpiration = TokenExpiration.Absolute,//刷新令牌将在固定时间点到期
                AbsoluteRefreshTokenLifetime = 2592000,//单位秒. RefreshToken的最长生命周期,默认30天
                RefreshTokenExpiration = TokenExpiration.Sliding,//刷新令牌时，将刷新RefreshToken的生命周期。RefreshToken的总生命周期不会超过AbsoluteRefreshTokenLifetime。
                SlidingRefreshTokenLifetime = 3600,//以秒为单位滑动刷新令牌的生命周期。
                //按照现有的设置，如果3600秒内没有使用RefreshToken，那么RefreshToken将失效。即便是在3600秒内一直有使用RefreshToken，RefreshToken的总生命周期不会超过30天。所有的时间都可以按实际需求调整。

                AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为true

                //登录成功后返回的客户端地址
                RedirectUris =
                {
                    //postman 模拟,  这个地址是后端的,实际开发可以是前端的地址
                    "http://127.0.0.1:6666/ids4/IndexToken",//简化模式implicit 
                },

                PostLogoutRedirectUris =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"
                },

                AllowedCorsOrigins =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"
                },

                AllowedScopes =
                {
                    "BackA2",
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.OfflineAccess, //如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess
                }
            });

            //FrontManage1, =>BackA1|BackA2:简化模式implicit
            client.Add(new Client
            {
                ClientId = "FrontManage1",
                ClientName = "FrontManage1客户端",
                //ClientUri = "http://192.168.10.89:8000",
                ClientUri = "http://127.0.0.1",//postman不需要,实际不知道

                AllowedGrantTypes = GrantTypes.Implicit,
                AllowAccessTokensViaBrowser = true,
                RequireConsent = false, //为true 时, 要单独写 controller + 页面
                ClientSecrets = new[] { new Secret("secret_FrontManage1".Sha256()) },

                AccessTokenLifetime = 3600,//设置AccessToken过期时间

                //RefreshTokenExpiration = TokenExpiration.Absolute,//刷新令牌将在固定时间点到期
                AbsoluteRefreshTokenLifetime = 2592000,//单位秒. RefreshToken的最长生命周期,默认30天
                RefreshTokenExpiration = TokenExpiration.Sliding,//刷新令牌时，将刷新RefreshToken的生命周期。RefreshToken的总生命周期不会超过AbsoluteRefreshTokenLifetime。
                SlidingRefreshTokenLifetime = 3600,//以秒为单位滑动刷新令牌的生命周期。
                //按照现有的设置，如果3600秒内没有使用RefreshToken，那么RefreshToken将失效。即便是在3600秒内一直有使用RefreshToken，RefreshToken的总生命周期不会超过30天。所有的时间都可以按实际需求调整。

                AllowOfflineAccess = true,//如果要获取refresh_tokens ,必须把AllowOfflineAccess设置为true

                //登录成功后返回的客户端地址
                RedirectUris =
                {
                    "http://127.0.0.1:5555/ids4/IndexToken",//简化模式implicit 
                },

                PostLogoutRedirectUris =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"
                },

                AllowedCorsOrigins =
                {
                    //"http://192.168.10.89:8000"
                    "http://127.0.0.1"
                },

                AllowedScopes =
                {
                    "BackA1",
                    "BackA2",
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                }
            });

            //TimerA1, BackA1:客户端认证ClientCredentials
            client.Add(new Client
            {
                ClientId = "TimerA1", //访问客户端Id,必须唯一
                ClientName = "TimerA1客户端",

                AllowedGrantTypes = GrantTypes.ClientCredentials, //使用客户端授权模式，客户端只需要clientid和secrets就可以访问对应的api资源。

                ClientSecrets = { new Secret("secret_TimerA1".Sha256()) },

                //AllowedScopes = { "api1" }
                AllowedScopes =
                {
                    //OpenId 和 Profile 两个是获取 IdentifyData  (id数据,身份证认证数据)
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    //Profile还可以这样写:   profile   或   new  IdentityResources.Profile().Name

                    IdentityServerConstants.StandardScopes.Email,
                    IdentityServerConstants.StandardScopes.Address,
                    IdentityServerConstants.StandardScopes.Phone,
                    "BackA1",
                },
                #region v4版本的没有了 去哪里了
                ////todo:v4版本的没有了 去哪里了
                ////在此属性上设置的值将会被直接添加到AccessToken
                ////Client这里设置的Claims默认都会被带一个client_前缀
                ////[Authorize(Roles ="admin")] 使用的Claim是role (也就是 new TestUser() 里的 claim )  而不是client_role ( new Client() 里的 claim )
                //Claims = new List<Claim>()
                //{
                //    //当前client 拥有 role , 并不代表它一定会使用,
                //    //是否使用,在api中的 Claims 中说明
                //    //new Claim(JwtClaimTypes.Role, "admin")

                //    new Claim(IdentityModel.JwtClaimTypes.Role, "Admin"),
                //    new Claim(IdentityModel.JwtClaimTypes.NickName, "root"),
                //    new Claim("eMail", "10000@qq.com")
                //} 
                #endregion
            });

            //BackA1,  =>BackA2:客户端认证ClientCredentials
            client.Add(new Client
            {
                ClientId = "BackA1", //访问客户端Id,必须唯一
                ClientName = "BackA1客户端",

                AllowedGrantTypes = GrantTypes.ClientCredentials, //使用客户端授权模式，客户端只需要clientid和secrets就可以访问对应的api资源。

                ClientSecrets = { new Secret("secret_BackA1".Sha256()) },

                //AllowedScopes = { "api1" }
                AllowedScopes =
                {
                    //OpenId 和 Profile 两个是获取 IdentifyData  (id数据,身份证认证数据)
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    //Profile还可以这样写:   profile   或   new  IdentityResources.Profile().Name
                    IdentityServerConstants.StandardScopes.Email,
                    IdentityServerConstants.StandardScopes.Address,
                    IdentityServerConstants.StandardScopes.Phone,
                    "BackA2",
                },
                #region v4版本的没有了 去哪里了
                ////todo:v4版本的没有了 去哪里了
                ////在此属性上设置的值将会被直接添加到AccessToken
                ////Client这里设置的Claims默认都会被带一个client_前缀
                ////[Authorize(Roles ="admin")] 使用的Claim是role (也就是 new TestUser() 里的 claim )  而不是client_role ( new Client() 里的 claim )
                //Claims = new List<Claim>()
                //{
                //    new Claim(IdentityModel.JwtClaimTypes.Role, "Admin"),
                //    new Claim(IdentityModel.JwtClaimTypes.NickName, "root"),
                //    new Claim("eMail", "10000@qq.com")
                //} 
                #endregion
            });

            //BackA1,  =>BackA2:客户端认证ClientCredentials
            client.Add(new Client
            {
                ClientId = "BackA2", //访问客户端Id,必须唯一
                ClientName = "BackA2客户端",
                AllowedGrantTypes = GrantTypes.ClientCredentials, //使用客户端授权模式，客户端只需要clientid和secrets就可以访问对应的api资源。

                ClientSecrets = { new Secret("secret_BackA2".Sha256()) },

                //AllowedScopes = { "api1" }
                AllowedScopes =
                {
                    //OpenId 和 Profile 两个是获取 IdentifyData  (id数据,身份证认证数据)
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    //Profile还可以这样写:   profile   或   new  IdentityResources.Profile().Name
                    IdentityServerConstants.StandardScopes.Email,
                    IdentityServerConstants.StandardScopes.Address,
                    IdentityServerConstants.StandardScopes.Phone,
                },
               
                #region v4版本的没有了 去哪里了
                ////todo:v4版本的没有了 去哪里了
                ////在此属性上设置的值将会被直接添加到AccessToken
                ////Client这里设置的Claims默认都会被带一个client_前缀
                ////[Authorize(Roles ="admin")] 使用的Claim是role (也就是 new TestUser() 里的 claim )  而不是client_role ( new Client() 里的 claim )
                //Claims = new List<Claim>()
                //{
                //    new Claim(IdentityModel.JwtClaimTypes.Role, "Admin"),
                //    new Claim(IdentityModel.JwtClaimTypes.NickName, "root"),
                //    new Claim("eMail", "10000@qq.com")
                //} 
                #endregion
            });


            return client;

        }
    }
}
